package design_pattern.BalkingMode;

import java.io.FileWriter;
import java.io.IOException;
import java.io.StringReader;
import java.io.Writer;

/**
 * @Author: 蔡翔
 * @Date: 2019/11/14 15:07
 * @Version 1.0
 *
 * （重要）思路：一个人在餐厅 点餐，他举手呼叫服务员，其中一个服务员看到了过去处理，但是另外一个服务员离顾客比较近 就先过去了，所以远的那个服务员就放弃了
 * BalkingData 代表一个文件
 */
public class BalkingData {
    private final String fileName;
    private String content;
    // 这里的change 变量，是整个 Balking的核心
    private boolean changed;

    public BalkingData(String fileName,String content){
        this.fileName = fileName;
        this.content = content;
        this.changed = true;
    }

    //发出 “诉求”，等待线程来受理
    public synchronized void change(String newContent){
        this.content = newContent;
        this.changed = true;
    }

    // “巡视的人”  检测现在是否有“诉求”，如果有就去解决诉求（这里只能单线程的去解决）
    public synchronized void save() throws IOException {
        if(!changed){
            return;
        }
        doSave();
        // 诉求已被受理
        this.changed = false;
    }

    private void doSave() throws IOException {
        System.out.println(Thread.currentThread().getName()+" calls do save, content="+content);
        try(Writer writer = new FileWriter(fileName,true)){
            writer.write(content);
            writer.write("\n");
            writer.flush();
            //try (){}  会自动关闭里面的代码
        }
    }
}